package com.zsy._22八锁现象;

import java.util.concurrent.TimeUnit;

/**
 * 3、增加了一个普通方法后！先执行发短信还是Hello？ 普通方法
 * 原因：普通方法不用抢占锁，不受锁的影响
 * <p>
 * 4、两个对象，两个同步方法， 发短信还是 打电话？ // 打电话
 * 原因：两个线程抢占的不是同一把锁
 */
@SuppressWarnings("all")
public class Test2 {
    public static void main(String[] args) {
        // 两个对象，两个调用者，两把锁！
        Phone2 phone1 = new Phone2();
        Phone2 phone2 = new Phone2();
        //锁的存在
        new Thread(() -> phone1.sendSms(), "A").start();

        // 捕获
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() -> phone2.call(), "B").start();

        new Thread(() -> phone1.hello(), "C").start();
    }

    static class Phone2 {
        // synchronized 锁的对象是方法的调用者！
        public synchronized void sendSms() {
            try {
                TimeUnit.SECONDS.sleep(4);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("发短信");
        }

        public synchronized void call() {
            System.out.println("打电话");
        }

        // 这里没有锁！不是同步方法，不受锁的影响
        public void hello() {
            System.out.println("hello");
        }
    }
}
